package com.tj.basic;

import org.junit.Test;

/**
 * 关于运算符的使用
 */
public class Operator {
    /**
     * 算术运算符：+、-、*、/、%、++、--
     * （1）/：除法，除数不能为0，否则会报运行时异常java.lang.ArithmeticException
     * 如果是两个整数相除，那么结果也为一个整数，其为整数相除的结果向下取整，即直接抛弃小数点之后的值
     * （2）%：求余，或者说模运算。
     * 两边必须是整数，且除数不能为0.
     * （3）++：自增运算符
     * 加加在前，先对自身加1，再取值进行运算；加加在后，先取值参与运算，再对自身加1
     * 不管在前在后，都会对自身加1，只是看对其所在算式的影响。
     * （4）--：自减运算符
     * 规则与自增类似，只不过是做减一运算
     */
    @Test
    public void test01(){
        int a = 15;
        int b = 4;
        System.out.println(a+b);//19
        System.out.println(a-b);//11
        System.out.println(a*b);//60
        System.out.println(a/b);//3
        System.out.println(a%b);//3

//      System.out.println(15/0);

        int c1 = 30;
        int c2 = 30;
        System.out.println(c1++);//30
        System.out.println(c1);//31
        System.out.println(++c2);//31
        System.out.println(c2);//31
    }

    /**
     * 比较运算符：>、<、==、!=、>=、<=
     * （1）比较运算符的结果是boolean类型，为false或者true
     * （2）注意!=是英文的!
     */
    @Test
    public void test02(){
        System.out.println(10>5);//true
        System.out.println(10<5);//false
        System.out.println(10==5);//false
        System.out.println(10!=5);//true
        System.out.println(10>=5);//true
        System.out.println(10<=5);//false
    }
    /**
     * 逻辑运算符：&&、||、!
     * （1）
     * &&：与运算，两边都为true才为true，否则为false
     * ||：或运算，两边都为false才为false，否则为true
     * !：非运算，true为false，false为true
     * （2）与运输和或运算都是短路运算
     * 如果&&前为false，那么就不会再去判断&&后的值
     * 如果||前为true，那么就不会再去判断||后的值
     * （3）运算优先级
     *三者没有优先级的区别，或者说同级
     * 运算时，如果是非运算，则先取反
     * 如果是与运算，则先进行与运算
     * 如果是或运算，则先进行或运算
     * 如果不能通过短路运算直接得到结果，那么就需要从左往右依次计算
     */
    @Test
    public void test03(){
        int a=10;
        int b=15;
        int c=20;
        //System.out.println((a++==10)&&(b++==15)||(c++==20));//true,11,16,20
        //System.out.println((a++==10)||(b++==15)&&(c++==20));//true,11,15,20
        System.out.println((a++==10)||(b++==15)&&!(c++==20));//true,11,15,20
        System.out.println(a+","+b+","+c);
    }
    /**
     * 位运算：&、|、~、^
     * &：按位与，都为1取1，否则取0
     * |：按位或，都为0取0，否则取1
     * ~：按位取反，1取0，0取1
     * ^：按位异或，相异取1，相同取0
     *
     * 位移运算：>>、>>>、<<
     * >>：右移，高位补符号位
     * >>>：右移高位补零
     * <<：左移，低位补零
     */

    /**
     * 赋值运算符：=
     * 算术运算符和位运算符、位移运算符可以与赋值运算符结合
     */

    /**
     * 条件运算符：布尔表达式?值1:值2
     * 布尔表达式为true取值1，为false取值2
     */
}
